/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.senaclem.logica;

import co.edu.senaclem.modelo.Aprendiz;
import co.edu.senaclem.modelo.Coordinador;
import co.edu.senaclem.modelo.Funcionario;
import co.edu.senaclem.modelo.Guarda;
import co.edu.senaclem.modelo.Instructor;
import co.edu.senaclem.modelo.Personal;
import co.edu.senaclem.persistencia.IAprendizDAO;
import co.edu.senaclem.persistencia.ICoordinadorDAO;
import co.edu.senaclem.persistencia.IFuncionarioDAO;
import co.edu.senaclem.persistencia.IGuardaDAO;
import co.edu.senaclem.persistencia.IInstructorDAO;
import co.edu.senaclem.persistencia.IPersonalDAO;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.faces.context.FacesContext;
import org.apache.commons.codec.digest.DigestUtils;

/**
 *
 * @author FELIPE
 */
@Stateless
public class UsuariosLogica implements UsuariosLogicaLocal {

    @EJB
    private ICoordinadorDAO coordinadorDAO;
    @EJB
    private IGuardaDAO guardaDAO;
    @EJB
    private IInstructorDAO instructorDAO;
    @EJB
    private IAprendizDAO aprendizDAO;
    @EJB
    private IPersonalDAO personalDAO;
    @EJB
    private IFuncionarioDAO FuncionarioDAO;
    

    @Override
    public void autenticar(Coordinador coordinador) throws Exception {
        if (coordinador.getDocumentocoordinador() == null || coordinador.getDocumentocoordinador() == 0) {
            throw new Exception("El Documento es Obligatorio!");
        }

        if (coordinador.getPersonal().getClavepersonal() == null || coordinador.getPersonal().getClavepersonal().equals("")) {
            throw new Exception("La Contraseña es Obligatoria!");
        }

        //verifica si el coordinador con ese documento existe
        Coordinador entity = coordinadorDAO.consultarPorId(coordinador.getDocumentocoordinador());
        if (entity == null) {
            throw new Exception("Usuario Incorrecto!");
        }

        //se encripta la contraseña digitada en el logeo antes de compararla en la bd
        String passEncriptado=encriptarContraseña(coordinador.getPersonal().getClavepersonal());        
        //si la contraseña no coincide...
        if (!entity.getPersonal().getClavepersonal().equals(passEncriptado)) {
            throw new Exception("Usuario Incorrecto!");
        }      
        
    }

    @Override
    public void autenticar(Guarda guarda) throws Exception {
        if (guarda.getDocumentoguarda() == null || guarda.getDocumentoguarda() == 0) {
            throw new Exception("El Documento es Obligatorio!");
        }        
        
        if (guarda.getPersonal().getClavepersonal()== null || guarda.getPersonal().getClavepersonal().equals("")) {
            throw new Exception("La Contraseña es Obligatoria!");
        }

        //verifica si el guarda con ese documento existe
        Guarda entity = guardaDAO.consultarPorId(guarda.getDocumentoguarda());
        if (entity == null) {
            throw new Exception("Usuario Incorrecto!");
        }
        //se encripta la contraseña digitada en el logeo antes de compararla en la bd
        String passEncriptado=encriptarContraseña(guarda.getPersonal().getClavepersonal());
        //si la contraseña no coincide
        if (!entity.getPersonal().getClavepersonal().equals(passEncriptado)) {
            throw new Exception("Usuario Incorrecto!");
        }
    }

    @Override
    public void autenticar(Instructor instructor) throws Exception {
        if (instructor.getDocumentoinstructor() == null || instructor.getDocumentoinstructor() == 0) {
            throw new Exception("El Documento es Obligatorio!");
        }
        
        if (instructor.getPersonal().getClavepersonal()== null || instructor.getPersonal().getClavepersonal().equals("")) {
            throw new Exception("La Contraseña es Obligatoria!");
        }

        //verifica si el instructor con ese documento existe
        Instructor entity = instructorDAO.consultarPorId(instructor.getDocumentoinstructor());
        if (entity == null) {
            throw new Exception("Usuario Incorrecto!");
        }
        //se encripta la contraseña digitada en el logeo antes de compararla en la bd
        String passEncriptado=encriptarContraseña(instructor.getPersonal().getClavepersonal());
        //si la contraseña no coincide
        if (!entity.getPersonal().getClavepersonal().equals(passEncriptado)) {
            throw new Exception("Usuario Incorrecto!");
        }
    }
    
    @Override
    public void autenticar(Aprendiz aprendiz) throws Exception {
        if (aprendiz.getDocumentoaprendiz() == null || aprendiz.getDocumentoaprendiz() == 0) {
            throw new Exception("El Documento es Obligatorio!");
        }
        
        if (aprendiz.getPersonal().getClavepersonal()== null || aprendiz.getPersonal().getClavepersonal().equals("")) {
            throw new Exception("La Contraseña es Obligatoria!");
        }

        //verifica si el instructor con ese documento existe
        Aprendiz entity = aprendizDAO.consultarPorId(aprendiz.getDocumentoaprendiz());
        if (entity == null) {
            throw new Exception("Usuario Incorrecto!");
        }
        //se encripta la contraseña digitada en el logeo antes de compararla en la bd
        String passEncriptado=encriptarContraseña(aprendiz.getPersonal().getClavepersonal());
        //si la contraseña no coincide
        if (!entity.getPersonal().getClavepersonal().equals(passEncriptado)) {
            throw new Exception("Usuario Incorrecto!");
        }
    }
       

    @Override
    public boolean validarSesion() {
        String user = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
        //System.out.println("usuario: " + user);
        //System.out.println("Tipo usuario: " + (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("tipoUsuario"));

        if (user == null) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public void cambiarContraseña(String usuario, String passOld, String passNew, String passNew2) throws Exception {
        if (passOld == null || passNew == null || passNew2 == null
                || passOld.equals("") || passNew.equals("") || passNew2.equals("")) {
            throw new Exception("La Contraseña Actual, la Nueva y su Confirmación Son Obligatorias!");
        }

        if (!passNew.equals(passNew2)) {
            throw new Exception("La Contraseña Nueva debe Coincidir con Su Confirmación!");
        }

        //se encripta la contraseña digitada antes de compararla en la bd
        String passEncriptado=encriptarContraseña(passOld);
        
        //verifica si el coordinador con ese documento existe
        Personal entityPersonal=personalDAO.consultarPorId(Long.parseLong(usuario));
        if (entityPersonal == null) {
           throw new Exception("Usuario Incorrecto!");
        }
        
        //si la contraseña no coincide
        if (!entityPersonal.getClavepersonal().equals(passEncriptado)) {
            throw new Exception("La Contraseña Otorgada No es Correcta para el Usuario!");
        }      
        entityPersonal.setClavepersonal(passNew);
        
        personalDAO.cambiarContraseña(entityPersonal); 

    }

    public String encriptarContraseña(String password) {
        String encriptMD5 = DigestUtils.md5Hex(password);
        //System.out.println("md5:" + encriptMD5);
        
        return encriptMD5;
    }

    @Override
    public void validarFuncionario(Funcionario funcionario) throws Exception {
        if (funcionario.getDocumentofuncionario() == null || funcionario.getDocumentofuncionario() == 0) {
            throw new Exception("El Documento es Obligatorio!");
        }
        
        if (funcionario.getPersonal().getClavepersonal()== null || funcionario.getPersonal().getClavepersonal().equals("")) {
            throw new Exception("La Contraseña es Obligatoria!");
        }

        //verifica si el instructor con ese documento existe
        Funcionario entity = FuncionarioDAO.consultarPorId(funcionario.getDocumentofuncionario());
        if (entity == null) {
            throw new Exception("Usuario Incorrecto!");
        } 
        
        //se encripta la contraseña digitada en el logeo antes de compararla en la bd
        String passEncriptado=encriptarContraseña(funcionario.getPersonal().getClavepersonal());
        //si la contraseña no coincide
        if (!entity.getPersonal().getClavepersonal().equals(passEncriptado)) {
            throw new Exception("Usuario Incorrecto!");
        }
    }

    @Override
    public void autenticarFuncionarioPunto(Funcionario funcionario) throws Exception {
        validarFuncionario(funcionario);
        
        //verifica si el instructor con ese documento existe
        Funcionario entity = FuncionarioDAO.consultarPorId(funcionario.getDocumentofuncionario());
        if (!entity.getCodigoarea().getNombrearea().equals("PUNTO ATENCION AL USUARIO")) {
            throw new Exception("Usuario Incorrecto!");
        }
        
        guardarDatosFuncionarioSesion(entity);
        
    }

    @Override
    public void autenticarFuncionarioDependencia(Funcionario funcionario) throws Exception {
        validarFuncionario(funcionario);
        
        //verifica si el instructor con ese documento existe
        Funcionario entity = FuncionarioDAO.consultarPorId(funcionario.getDocumentofuncionario());
        if (entity.getCodigoarea().getNombrearea().equals("PUNTO ATENCION AL USUARIO") || entity.getCodigoarea().getNombrearea().equals("COORDINACION ADMINISTRATIVA")) {
            throw new Exception("Usuario Incorrecto!");
        }
        
        guardarDatosFuncionarioSesion(entity);
    }

    @Override
    public void autenticarCoordinadorAdministrativo(Funcionario funcionario) throws Exception {
        validarFuncionario(funcionario);
        
        //verifica si el instructor con ese documento existe
        Funcionario entity = FuncionarioDAO.consultarPorId(funcionario.getDocumentofuncionario());
        if (!entity.getCodigoarea().getNombrearea().equals("COORDINACION ADMINISTRATIVA")) {
            throw new Exception("Usuario Incorrecto!");
        }
        
        guardarDatosFuncionarioSesion(entity);
    }

    public void guardarDatosFuncionarioSesion(Funcionario funcionario)
    {
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("codigoDependencia",funcionario.getCodigoarea().getCodigodependencia().getCodigodependencia());
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("nombreDependencia",funcionario.getCodigoarea().getCodigodependencia().getNombredependencia());
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("codigoArea",funcionario.getCodigoarea().getCodigoarea());
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("nombreArea",funcionario.getCodigoarea().getNombrearea());
   
//        System.out.println("codigoDependencia: "+(Integer)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("codigoDependencia"));
//        System.out.println("nombreDependencia: "+(String)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("nombreDependencia"));
//        System.out.println("codigoArea: "+(Integer)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("codigoArea"));
//        System.out.println("nombreArea: "+(String)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("nombreArea"));
    }
}
